package com.company.project.model.seek;

import java.util.List;


/**
 * @Author: cjj
 * @Date: Create in:18-3-7 下午4:08
 * @Description:定义领域模型中仓储的实现规范。
 */
public interface IRepository<T, Tkey> {
    /**
     * 获得到数据库记录的总数。
     *
     * @return
     */
    int count();


    /**
     * 删除数据库中一个已存在的聚合根对象。
     *
     * @param entity
     */
    void delete(T entity);


    /**
     * 从数据库中立刻加载一个聚合根对象。
     *
     * @param id 聚合根对象标识。
     * @return 拥有此标识的聚合根对象
     */
    T get(Tkey id);


    /**
     * 从数据库中延迟加载一个聚合根对象。
     *
     * @param id 聚合根对象标识。
     * @return
     */
    T load(Tkey id);


    /**
     * 从数据库立刻加载所有聚合根对象。
     *
     * @return 聚合根对象集合。
     */
    List<T> query();


    /**
     * 保存一个新的聚合根对象到数据库。
     *
     * @param entity 聚合根对象。
     * @return 聚合根的标识符。
     */
    Tkey save(T entity);


    /**
     * 如果聚合根对象是一个新对象则保存至数据库，如果聚合根对象已存在于数据库则更新，实现乐观锁策略。
     *
     * @param entity 聚合根对象。
     */
    void saveOrUpdate(T entity);


    /**
     * 更新数据库中一个已存在的聚合根对象，并且实现乐观锁策略。
     *
     * @param entity 聚合根对象。
     */
    void update(T entity);
}
